/*
 * MAdministadorConsultas.java
 *
 * Created on 3 de abril de 2006, 10:38 AM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package ig.metrica.ui.origenesdedatos;

import ig.metrica.origenesdedatos.*;
import ig.metrica.ui.ServiceLocator;
import ig.metrica.ui.interfaces.comunes.IModelo;
import ig.util.NoContinuaException;
import java.rmi.RemoteException;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Timestamp;
import java.util.Collection;
import java.util.Iterator;
import java.util.Properties;
import java.util.ArrayList;

/**
 *
 * @author jsanchez
 */
public class MAdministadorConsultas implements IModelo{
    PAdministradorConsultas panel=null;
    /** Creates a new instance of MAdministadorConsultas */
    Collection COrigenesDatos=null;
    Collection COrigenesDatosRemote=null;
    Collection CConexiones=null;
    Collection CEntidades=null;
    //OrigenDeDatosHome home =null;
    //ConexionHome conexionHome=null;
    public MAdministadorConsultas(PAdministradorConsultas panel)throws Exception {
        this.panel=panel;
        CConexiones = new ConexionBean().ejbFindByPropiedades( "","","","","");
        setDataCBoxConexiones(CConexiones);
    }
    
    public void guardar() throws NoContinuaException {
        if(panel.getSelectCBoxConsulta()<0){
            int idInternal = Integer.valueOf( panel.getConexion().trim().split("-")[0].trim());
            for (Object elemTO: COrigenesDatos) {
                OrigenesdatosDTO TO=(OrigenesdatosDTO) elemTO;
                //TO.setQuery(panel.getQuery());
                if(TO.getConsecutivo().equals(panel.getSelectCBoxConsulta())){
                    TO.setQuery(panel.getQuery());
                    TO.setIdconexion(idInternal);
                    TO.setTipo(panel.isBloquePl() ? "P" : "Q");
                    try {
                        new OrigenDeDatosBean().ejbCreate(TO.getId(),TO.getEntidad(),TO.getCampos(),TO.getQuery(),TO.getIdconexion(),TO.getConsecutivo(), TO.getTipo());
                    } catch (Exception ex) {
                        throw new NoContinuaException(ex.toString());
                        //ex.printStackTrace();
                    }
                }
            }
        }else{
            if(COrigenesDatosRemote==null)
                try {
                    COrigenesDatosRemote=new OrigenDeDatosBean().ejbFindByAll();
                /*} catch (RemoteException ex) {
                    ex.printStackTrace();*/
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            for (Object elem : COrigenesDatosRemote) {
                
                try {
                    if(panel.getSelectCBoxConsulta()==((OrigenesdatosDTO)elem).getConsecutivo()){
                        int idInternal = Integer.valueOf( panel.getConexion().trim().split("-")[0].trim());
                        /*for (int i = 0; i < panel.getConexion().length(); i++) {
                            String CARACTER=panel.getConexion().substring(i,i+1);
                            if(CARACTER.equals("-")){
                                idInternal= Integer.valueOf(panel.getConexion().substring(i+1)).intValue();
                                break;
                            }
                        }*/
                        if(idInternal!=-1){
                            ((OrigenesdatosDTO)elem).setQuery( panel.getQuery() );
                            ((OrigenesdatosDTO)elem).setIdconexion(idInternal);
                            ((OrigenesdatosDTO)elem).setTipo(panel.isBloquePl() ? "P" : "Q");
                             OrigenDeDatosBean origenDeDatosBean = new OrigenDeDatosBean();
                             origenDeDatosBean.setOrigenesdatosDTO( ((OrigenesdatosDTO)elem) );
                             origenDeDatosBean.actualizarEntidad();
                             break;
                        }
                    }
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        }//else
    }
    
    /*private int getIdConexion(String conexion){
        for (Object elem : COrigenesDatos) {
            int idInternal=-1;
            if(panel.getSelectCBoxConsulta()==((OrigenesdatosDTO)elem).getConsecutivo()){
                for (int i = 0; i < panel.getConexion().length(); i++) {
                    String CARACTER=panel.getConexion().substring(i,i+1);
                    if(CARACTER.equals("-")){
                        idInternal= Integer.valueOf(panel.getConexion().substring(i+1)).intValue();
                        return idInternal;
                    }
                }
                //((OrigenDeDatos)elem).setQuery( panel.getQuery() );
                //((OrigenDeDatos)elem).setConexionPK(new ConexionPK(idInternal));
            }
        }
        return -1;
    }*/
    private Long getNameConexion(String conexion){
        //String idInternal="";
        //for (Object elem : COrigenesDatos) {
            //if(panel.getSelectCBoxConsulta()==((OrigenesdatosDTO)elem).getConsecutivo()){
                return Long.valueOf( conexion.trim().split("-")[0].trim() );
                /*for (int i = 0; i < panel.getConexion().length(); i++) {
                    String CARACTER=panel.getConexion().substring(i,i+1);
                    if(CARACTER.equals("-")){
                        idInternal= panel.getConexion().substring(0,i);
                        //System.out.println("NAME:CONEXION:"+idInternal);
                        return idInternal;
                    }
                }*/
                //((OrigenDeDatos)elem).setQuery( panel.getQuery() );
                //((OrigenDeDatos)elem).setConexionPK(new ConexionPK(idInternal));
           // }
        //}
        //return idInternal;
    }
    
    private String getNameConexion(Integer integer) {
        for (Object elem : CConexiones) {
            try {
                int id=Integer.valueOf(((ConexionBean)elem).getId().toString());
                if(id==integer){
                    return ((ConexionBean)elem).getNombre();
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
        return null;
    }
    
    
    
    public Collection buscar() throws NoContinuaException {
        try {
            /*Properties prop = new Properties();
            prop.put( Context.INITIAL_CONTEXT_FACTORY, IGBean.INITIAL_CONTEXT_FACTORY);
            String Sockec = new ConexionServer().getSocketServer();
            prop.put( Context.PROVIDER_URL, Sockec);
            InitialContext ctx;
            ctx = new InitialContext(prop);
            home = (OrigenDeDatosHome)ctx.lookup("ig.metrica.origenesdedatos.OrigenDeDatos");
            OrigenDeDatos origenesDatos=home.findByPrimaryKey(new OrigenDeDatosPK(1));*/
            COrigenesDatos=new OrigenDeDatosBean().ejbFindByAll();
            setDataCBoxEntidades(COrigenesDatos);
            return COrigenesDatos;
        /*} catch (RemoteException ex) {
            ex.printStackTrace();
        } catch (FinderException ex) {
            ex.printStackTrace();
        } catch (NamingException ex) {
            ex.printStackTrace();*/
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }
    
    public Integer getConsecutivo() {
        return consecutivo;
    }
    
    
    public void modificar() throws NoContinuaException {
    }
    OrigenesdatosDTO newOrigenesdatosDTO=null;
    boolean nuevo=false;
    public void nuevo() throws NoContinuaException {
        nuevo=true;
        newOrigenesdatosDTO= (OrigenesdatosDTO) getTO();
        COrigenesDatos.add(newOrigenesdatosDTO);
        
        setDataCBoxEntidades(COrigenesDatos);
        updateData("entidades");
//        try {
//            home.create(null,null,null,null,null);
//        } catch (RemoteException ex) {
//            ex.printStackTrace();
//        } catch (CreateException ex) {
//            ex.printStackTrace();
//        }
    }
    
    
    public void eliminar() throws NoContinuaException {
        //OrigenDeDatosPK pk= new OrigenDeDatosPK(1);
        try {
            if(!new OrigenDeDatosBean().eliminarConsulta(panel.getSelectCBoxConsulta())){
                throw new NoContinuaException("No se pudo eliminar la Consulta por error de con la Base de Datos");
            }
        } catch (Exception ex) {
            throw new NoContinuaException(ex.toString());
        }
    }
    
    public void salir() throws NoContinuaException {
    }
    
    public void imprimir() throws NoContinuaException {
    }
    public Integer consecutivo=-1;
    public Object getTO() throws NoContinuaException {
        OrigenesdatosDTO TO=new OrigenesdatosDTO();
        for (Object elem : this.COrigenesDatos) {
            if(((OrigenesdatosDTO)panel.getSelectCBoxEntidad()).getEntidad().equals(((OrigenesdatosDTO)elem).getEntidad())){
                TO.setCampos(((OrigenesdatosDTO)elem).getCampos());
                TO.setConsecutivo(consecutivo);
                TO.setEntidad(((OrigenesdatosDTO)elem).getEntidad());
                TO.setId(((OrigenesdatosDTO)elem).getId());
                TO.setIdconexion(((OrigenesdatosDTO)elem).getIdconexion());
                TO.setQuery("/*NAME: Nuevo */");
                consecutivo--;
                return TO;
            }
        }
        return null;
    }
    
    public void cancelar() throws NoContinuaException {
        
    }
    
    
    public synchronized void validarConsulta(){
        //setCursor(new java.awt.Cursor(java.awt.Cursor.WAIT_CURSOR));
        /*Properties prop = new Properties();
        prop.put( Context.INITIAL_CONTEXT_FACTORY, IGBean.INITIAL_CONTEXT_FACTORY);
        String Sockec = new ConexionServer().getSocketServer();
        prop.put( Context.PROVIDER_URL, Sockec);*/
        
        try {
            if(panel.getQuery().toUpperCase().contains("DROP") || panel.getQuery().toUpperCase().contains("DELETE") || panel.getQuery().toUpperCase().contains("TRUNCATE") || panel.getQuery().toUpperCase().contains("UPDATE"))
                throw new Exception("DELETE, TRUNCATE, UPDATE son palabras reservadas");
            Long nameCombox=this.getNameConexion(panel.getConexion());
            //InitialContext ctx = new InitialContext(prop);
            
            Collection resultado = new ConexionBean().ejbFindByPropiedades( "", "", "", "", "" );
            Iterator i = resultado.iterator();
            while (i.hasNext()){
                ConexionBean conexion = (ConexionBean)i.next();
                //String NombreConexion=conexion.getNombre().trim();
                String connectURL=conexion.getUrl().trim();
                String uName=conexion.getUsuario().trim();
                String pWord=conexion.getPassword().trim();
                String driverName=conexion.getDriver().trim();
                Statement stmt = null;
                Connection connection = null;
                //CallableStatement stopPro = null;
                try {
                    if( conexion.getId().equals( nameCombox ) ){
                        connection=getConnections(connectURL, uName, pWord, driverName);
                        if ( panel.isBloquePl()  ){
                            String PL = "";//panel.getQuery();
                            String[] plS = panel.getQuery().split("\n");
                            for (int j = 0; j < plS.length; j++) {
                                PL += (plS[j].trim()+" ");
                            }
                            //stopPro = connection.prepareCall(PL);
                            //stopPro.execute();
                            stmt = connection.createStatement();
                            stmt.execute(PL);
                            
                        }else{
                            stmt = connection.createStatement();
                            ResultSet RESULTADO=stmt.executeQuery(panel.getQuery());
                            this.setDataReultado(RESULTADO);
                        }
                        panel.setValidacionConsulta("Validaci\u00F3n de Query exitoso para la fuente de datos: "+conexion.getNombre(),true);    
                        break;
                    }
                } catch (SQLException ex) {
                    setDataReultado(null);
                    panel.setValidacionConsulta("Error en la validaci\u00F3n del query: "+ex.toString(),false);
                    ex.printStackTrace();
                }catch(ClassNotFoundException ex){
                    setDataReultado(null);
                    panel.setValidacionConsulta("Error en la validaci\u00F3n del query: "+ex.toString(),false);
                    ex.printStackTrace();
                }catch(Exception ex){
                    setDataReultado(null);
                    panel.setValidacionConsulta("Error en la validaci\u00F3n del query: "+ex.toString(),false);
                    ex.printStackTrace();
                }finally{
                    try {stmt.close();} catch (Exception e) {}
                    try {connection.close();} catch (Exception e) {}
                    //try {stopPro.close();} catch (Exception e) {}
                }
            }
        } catch (Exception e) {
            try {setDataReultado(null);} catch (Exception ex) {}
            panel.setValidacionConsulta("Metrica no se pudo conectar con el Servidor:   "+ e.toString(),false);
            e.printStackTrace();
        }
    }
    
    private Connection getConnections(String connectURL, String uName, String pWord, String driverName)throws ClassNotFoundException,SQLException {
        try{
            Class.forName(driverName);
            Properties prop=new Properties();
            if(driverName.trim().equals("org.relique.jdbc.csv.CsvDriver")){
                prop.put("separator",uName.trim());
                prop.put("fileExtension",pWord.trim());
            }else{
                prop.put("user",uName.trim());
                prop.put("password",pWord.trim());
            }
            
            return DriverManager.getConnection(connectURL,prop);
        }catch(ClassNotFoundException ex){
            ex.printStackTrace();
            throw new ClassNotFoundException(ex.getMessage());
        }catch(SQLException ex){
            throw new SQLException(ex.getMessage());
        }
    }
    
//    public void updateTO(String Text,String  quien){
//        for (Object elem : this.COrigenesDatos){
//            if(panel.getSelectCBoxConsulta()==((OrigenesdatosDTO)elem).getConsecutivo()){
//                ((OrigenesdatosDTO)elem).setIdconexion(this.getIdConexion(this.panel.getConexion()));
//                ((OrigenesdatosDTO)elem).setQuery(this.panel.getQuery());
//                if(!panel.getNombreArchivo().trim().equals(""))
//                    ((OrigenesdatosDTO)elem).setNombreArchivo(panel.getNombreArchivo().trim());
//            }
//        }
//    }
    
//    Collection CConexionesTmp=new ArrayList();
    boolean nop=false;
    private void setDataCBoxEntidades(Collection COrigenesDatos) {
        Iterator i = COrigenesDatos.iterator();
        while(i.hasNext()){
            OrigenesdatosDTO tmp = (OrigenesdatosDTO)i.next();
            if((tmp.getId()<2000 && tmp.getConsecutivo()<2000) || (tmp.getId()>3000 && tmp.getConsecutivo()>3000) )
                panel.addDataCBoxEntidades(tmp);
        }
    }
    
    
    private void setDataCBoxConexiones(Collection CConexiones) {
        Iterator i = CConexiones.iterator();
        while(i.hasNext()){
            ConexionBean tmp = (ConexionBean)i.next();
            try {
                panel.addDataCBoxConexiones(tmp.getId() + " - " + tmp.getNombre());
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }
    private void setDataCBoxConsultas() {
        Iterator i = COrigenesDatos.iterator();
        panel.cleanCBoxConsultas();
        int primero=-1;
        while(i.hasNext()){
            OrigenesdatosDTO tmp = (OrigenesdatosDTO)i.next();
            if(((OrigenesdatosDTO)panel.getSelectCBoxEntidad()).getEntidad().equals(tmp.getEntidad())){
                if(primero==-1){
                    consulta=tmp.getQuery();
                    panel.setBloquePl(tmp.getTipo()!=null ? ( tmp.getTipo().equals("P") ) : false);
                    panel.setCampos(tmp.getCampos());
                    primero=tmp.getConsecutivo();
                    panel.setConexion(tmp.getIdconexion() +" - " +this.getNameConexion(tmp.getIdconexion()));
                }
                boolean seguir=false;
                String nombre="";
                for (int j = 0; j < tmp.getQuery().toCharArray().length && tmp.getQuery().contains("/*") && tmp.getQuery().contains("*/") ; j++) {
                    if(!seguir && tmp.getQuery().toCharArray()[j]=='/' && tmp.getQuery().toCharArray()[j+1]=='*')
                        seguir =true;
                    if(tmp.getQuery().toCharArray()[j]=='*' && tmp.getQuery().toCharArray()[j+1]=='/')
                        break;
                    if(seguir)
                        nombre=nombre+tmp.getQuery().toCharArray()[j+2];
                }
                nombre=nombre.trim();
                if(nombre.toUpperCase().startsWith("NOMBRE:")){
                    nombre=nombre.substring("NOMBRE:".length(),nombre.length()).trim();
                    if(nombre.trim().equals("*/"))
                        nombre="<No tiene nombre>";
                }else if(nombre.toUpperCase().startsWith("NAME:")){
                    nombre=nombre.substring("NAME:".length(),nombre.length()).trim();
                    if(nombre.trim().equals("*/"))
                        nombre="<No tiene nombre>";
                }else{
                    nombre="<No tiene nombre>";
                }
                panel.addDataCBoxConsultas(tmp.getConsecutivo(),!"<No tiene nombre>".equals(nombre)?nombre.substring(0,nombre.length()-2):nombre);
            }
        }
    }
    public static void main(String[] arg){
        
        if("/*hoa\nsdf*/".contains("/*"))
            System.out.println("si funciona"+"/*hoa\nsdf*/");
        
    }
    private String getConsulta(int index){
        for (Object elem : COrigenesDatos) {
            int llega=((OrigenesdatosDTO)elem).getConsecutivo();
            if(llega==index){
                panel.setConexion(((OrigenesdatosDTO)elem).getIdconexion() +" - " +this.getNameConexion(((OrigenesdatosDTO)elem).getIdconexion()));
                //System.out.println(((OrigenesdatosDTO)elem).getQuery());
                panel.setCampos(((OrigenesdatosDTO )elem).getCampos());
                String tipo = ((OrigenesdatosDTO )elem).getTipo();
                panel.setBloquePl(tipo!=null ? tipo.trim().equals("P") : false);
                return  ((OrigenesdatosDTO )elem).getQuery();
            }
        }
        return "NO TIENE";
    }
    String consulta="";
    public void updateData(String quien) {
        if(quien.equals("entidades")){
            setDataCBoxConsultas();
        }else if(quien.equals("consulta")){
            consulta=getConsulta(panel.getSelectCBoxConsulta());
        }
        panel.setConsulta(consulta);
    }
    
    /*private void setDataReultadoA(ArrayList RESULTADO) {
        int n = 0;
        try {
            if(RESULTADO!=null){
                String[] columnas=null;
                for (Object elem : RESULTADO) {
                    if(elem instanceof String[]){
                        columnas = (String[]) elem;
                        RESULTADO.remove(columnas);
                        break;
                    }
                }
                n = RESULTADO.iterator().hasNext()?((Object[])RESULTADO.iterator().next()).length:0;
                
                Collection<Object[]> c= new ArrayList();
                boolean k=false;
                Iterator Registro=RESULTADO.iterator();
                while(Registro.hasNext()){
                    Object[] Reg = (Object[])Registro.next();
                    Object[] obj= new Object[n];
                    for (int i = 0; i < columnas.length; i++) {
                        obj[i]=Reg[i];
                    }
                    c.add(obj);
                    k=true;
                }
                Object[][] data=new Object[c.size()][n];
                int i=0;
                for (Object[] elem : c) {
                    for (int j = 0; j < n; j++) {
                        if(elem[j]==null)
                            data[i][j]="<null>";
                        else if(elem[j].getClass().getName().equals("java.sql.Date") || elem[j].getClass().getName().equals("java.util.Date")||elem[j].getClass().getName().equals("java.sql.Timestamp")){
                            if(elem[j] instanceof java.sql.Date)
                                data[i][j]=new Timestamp(((java.sql.Date)elem[j]).getTime()).toString().substring(0,10);
                            else if(elem[j] instanceof java.sql.Timestamp)
                                data[i][j]=new Timestamp(((java.sql.Timestamp)elem[j]).getTime()).toString().substring(0,10);
                            else if(elem[j] instanceof java.util.Date)
                                data[i][j]=new Timestamp(((java.util.Date)elem[j]).getTime()).toString().substring(0,10);
                        }else{
                            data[i][j]=elem[j];
                        }
                    }
                    i++;
                }
                panel.nombreColunmas(columnas);
                panel.setData(data);
            }else
                panel.setData(null);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }*/
    
    private void setDataReultado(ResultSet RESULTADO) throws Exception {
        int n = 0;
        if(RESULTADO!=null){
            n = RESULTADO.getMetaData().getColumnCount();
            //panel.setValidacionConsulta(" ",false);
            String[] nombreCol= new String[n];
            for (int i = 1; i <=n; i++) {
                nombreCol[i-1]=RESULTADO.getMetaData().getColumnLabel(i);
//                    String tipo=RESULTADO.getMetaData().getColumnType(i);
            }
            Collection<Object[]> c= new ArrayList();
            boolean k=false;
            while(RESULTADO.next()){
                Object[] obj= new Object[n];
                for (int i = 1; i <= nombreCol.length; i++) {
                    //System.out.println( i + " : " + RESULTADO.getObject(i) );
                    nombreCol[i-1]= !k? nombreCol[i-1]+" ["+RESULTADO.getMetaData().getColumnTypeName(i)+"]":nombreCol[i-1]+"";
                    obj[i-1]=RESULTADO.getObject(i);
                }
                c.add(obj);
                k=true;
            }
            Object[][] data=new Object[c.size()][n];
            int i=0;
            for (Object[] elem : c) {
                for (int j = 0; j < n; j++) {
                    if(elem[j]==null)
                        data[i][j]="<null>";
                    else if(elem[j].getClass().getName().equals("java.sql.Date") || elem[j].getClass().getName().equals("java.util.Date")||elem[j].getClass().getName().equals("java.sql.Timestamp")){
                        if(elem[j] instanceof java.sql.Date)
                            data[i][j]=new Timestamp(((java.sql.Date)elem[j]).getTime()).toString().substring(0,10);
                        else if(elem[j] instanceof java.sql.Timestamp)
                            data[i][j]=new Timestamp(((java.sql.Timestamp)elem[j]).getTime()).toString().substring(0,10);
                        else if(elem[j] instanceof java.util.Date)
                            data[i][j]=new Timestamp(((java.util.Date)elem[j]).getTime()).toString().substring(0,10);
                    }else{
                        data[i][j]=elem[j];
                    }
                }
                i++;
            }
            panel.nombreColunmas(nombreCol);
            panel.setData(data);
        }else{
            panel.setData(null);
        }
    }
    
    
}